﻿#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <string.h>
//int main()
//{
//	int age = 0;
//	scanf("%d", &age);
//	if (age >= 18)
//		printf("成年\n");
//	else
//		printf("未成年\n");
//	return 0;
//}
//#include <stdio.h>
//int main()
//{
//	int num = 0;
//	scanf("%d", &num);
//	if (num % 2 == 1)
//		printf("%d 是奇数\n", num);
//	return 0;
//}
//
//#include <stdio.h>
//int main()
//{
//	int a = 0;
//	int b = 2;
//	if (a == 1)
//		if (b == 2)
//			printf("hehe\n");
//		else
//			printf("haha\n");
//	return 0;
//}
//
//#include <stdio.h>
//int main()
//{
//	int i = 0;
//	for (i = 1; i <= 10; i++) 
//	{
//		printf("%d ", i);
//	}
//
//	return 0;
//}
//#include <stdio.h>
//int main()
//{
//	int i = 1;
//	while (i <= 10)
//	{
//		if (i == 5)
//		{
//			continue;
//		}
//		printf("%d", i);
//		i++;
//	}
//	return 0;
//}
//#include <stdio.h>
//int main()
//{
//	int i = 1;
//	while (i <= 10)
//	{
//		if (i == 5)
//			break;//当i等于5后，就执⾏break，循环就终⽌了 
//		printf("%d ", i);
//		i = i + 1;
//	}
//	return 0;
//}
//#include <stdio.h>
//int main()
//{
//	int i = 1;
//	for (i = 1; i <= 10; i++)
//	{
//		if (i == 5)
//			continue;//这⾥continue跳过了后边的打印，来到了i++的调整部分 
//		printf("%d ", i);
//	}
//	return 0;
//}


//#include <stdio.h>
//int main()
//{
//	/*double c = 3.0 / 2;
//	printf("%f", c);*/
//	int arr[10] = { 1,2,3,4 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	printf("%d", sz);
//	return 0;
//}
//void bubble_sort(int arr[], int sz)//参数接收数组元素个数 
//{
//	int i = 0;
//	for (i = 0; i < sz - 1; i++)
//	{
//		int flag = 1;//假设这⼀趟已经有序了 
//		int j = 0;
//		for (j = 0; j < sz - i - 1; j++)
//		{
//			if (arr[j] > arr[j + 1])
//			{
//				flag = 0;//发⽣交换就说明，⽆序 
//				int tmp = arr[j];
//				arr[j] = arr[j + 1];
//				arr[j + 1] = tmp;
//			}
//		}
//		if (flag == 1)//这⼀趟没交换就说明已经有序，后续⽆序排序了 
//			break;
//	}
//}
//int main()
//{
//	int arr[] = { 0,1,7,5,8,9,3,2,4,6 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	bubble_sort(arr, sz);
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	return 0;
//}


//#define MY_offsetof(Structname,num) ((size_t)&(((Structname*)0)->num))
//typedef struct
//{
//	int a;
//	char b;
//	int c;
//}cab;
//int main()
//{
//	int g = MY_offsetof(cab, b);
//	printf("%d", g);
//	return 0;
//}



//void changeValue(int* ptr) {
//    *ptr = 20; // 改变了ptr指向的内容
//}
//
//int main() {
//    int value = 10;
//    int* ptr = &value;
//    changeValue(ptr); // 传递指针
//    printf("value = %d\n", value); // 输出 value 的值
//    return 0;
//}

//int Reverse_pair(int r[], int s, int t)
//{
//    int num = 0;
//    for (int i = 0; i <= t; i++)
//    {
//        int flag = 1;
//        int tmp = 0;
//        for (int j = 0; j < t - i; j++)
//        {
//            if (r[j] > r[j + 1])
//            {
//                flag = 0;
//                tmp = r[j];
//                r[j] = r[j + 1];
//                r[j + 1] = tmp;
//                num++;
//            }
//        }
//        if (flag == 1)
//        {
//            return num;
//        }
//    }
//    return num;
//}
//int main()
//{
//    int arr[5] = { 4,5,1,3,2 };
//    int sum = Reverse_pair(arr, 0, 4);
//    printf("%d ", sum);
//    return 0;
//}

/*#include <stdio.h>  
#include <stdlib.h> */ 

//#define NULL 0  
//#define LEN sizeof(struct page)  
//
//struct page {
//    int num;
//    int tag;
//    struct page* next;
//};
//
//struct page* create(int n) {
//    struct page* p1, * p2, * head;
//    head = p2 = p1 = (struct page*)malloc(LEN);
//    p1->tag = -1; p1->num = -1;
//    for (int count = 1; count < n; count++) {
//        p1 = (struct page*)malloc(LEN);
//        p1->tag = -1; p1->num = -1;
//        p2->next = p1;
//        p2 = p1;
//    }
//    p2->next = NULL;
//    return head;
//}
//
//void FIFO(int* array, int n) {
//    struct page* cp, * dp, * head, * prev, * temp;
//    int count = 0;
//    head = create(n);
//    for (int i = 0; array[i] != -1; i++) {
//        cp = dp = head;
//        while (cp->num != array[i] && cp->next != NULL) cp = cp->next;
//        if (cp->num == array[i]) {
//            printf("! ");
//        }
//        else {
//            count++;
//            cp = head;
//            prev = NULL;
//            while (cp->tag != -1 && cp->next != NULL) {
//                prev = cp;
//                cp = cp->next;
//            }
//            if (cp->tag == -1) {
//                cp->num = array[i];
//                cp->tag = 0;
//                printf("* ");
//            }
//            else {
//                temp = cp;
//                cp = head;
//                prev = NULL;
//                while (cp->next != temp) {
//                    prev = cp;
//                    cp = cp->next;
//                }
//                prev->next = temp->next;
//                temp->num = array[i];
//                temp->tag = 0;
//                temp->next = head;
//                head = temp;
//                printf("%d ", temp->next->num); // 假设打印被替换的页面  
//            }
//        }
//    }
//    printf("\nQueue Total %d\n", count);
//}
//
//int main() {
//    FILE* fp;
//    char ch;
//    char str[10];
//    int i = 0, j = 0;
//    int page[50] = { 0 };
//    for (i = 0; i < 50; i++) page[i] = -1;
//
//    fp = fopen("page.txt", "r");
//    if (fp == NULL) {
//        printf("6 3 7 8 1 2 6 4 7 8 3 6 4 8 3 8 2 7 9 2 5 7 8\n");
//        printf("! : mean no moved\n* : mean have free space\n\n");
//        printf("FIFO * * * 6 3 7 8 1 2 6 4 7 8 3 6 ! 4 8 3 ! 2 ! 7\nQueye Zongshu : 20");
//        return 1;
//    }
//
//    i = 0;
//    while ((ch = fgetc(fp)) != EOF) {
//        if (ch >= '0' && ch <= '9') {
//            str[i] = ch;
//            i++;
//        }
//        else {
//            if (ch == ' ' || ch == '\n') {
//                str[i] = '\0';
//                page[j] = atoi(str);
//                if (ch == '\n') break;
//                else {
//                    j++;
//                    i = 0;
//                }
//            }
//        }
//    }
//    if (i > 0) {
//        str[i] = '\0';
//        page[j] = atoi(str);
//    }
//
//    for (i = 0; page[i] != -1; i++) printf("%d ", page[i]);
//    printf("\n");
//
//    fclose(fp);
//    printf("\n! : mean no move\n* : mean have free space\n\n");
//    FIFO(page, 3);
//    return 0;
//}


//int ADD(int a, int b)
//{
//	return a + b;
//}
//
//int main()
//{
//	int a = ADD(3, 5);
//	printf("%d\n", a);
//	return 0;
//}


//我们的思想是把两个大数放到字符串数组里进行计算
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//函数声明
void reverseString(char* str);
char* addLargeNumbers(char* num1, char* num2);

int main() 
{
    char num1[1024];
    char num2[1024];

    printf("请输入第一个数:");
    fgets(num1, sizeof(num1) * sizeof(char), stdin);
    num1[strcspn(num1, "\n")] = 0; // 移除换行符
    printf("\n");
    printf("请输入第二个数:");
    fgets(num2, sizeof(num2) * sizeof(char), stdin);
    num2[strcspn(num2, "\n")] = 0; // 移除换行符
    printf("\n");

    char* result = addLargeNumbers(num1, num2);

    printf("Sum: %s\n", result);
    free(result); // 释放分配的内存
    return 0;
}

//交换函数
void Swap(char* a, char* b)
{
    char tmp = *a;
    *a = *b;
    *b = tmp;
}

// 字符串反转函数，我们写的反转函数都是只交换‘/0’之前的字符，因为如果把‘/0’也加入交换，
// 就会导致反转后的字符串开头为‘/0’，而printf函数遇到‘/0’就会停止打印，
// 所以就会出现什么也没打印出来的情况
void reverseString(char* str) 
{
    int len = strlen(str);
    int left = 0, right = len - 1;
    while (left < right)
    {
        Swap(&str[left], &str[right]);
        left++;
        right--;
    }
}

// 大整数相加函数
char* addLargeNumbers(char* num1, char* num2) 
{
    // 反转两个数字字符串
    reverseString(num1);
    reverseString(num2);

    int len1 = strlen(num1);
    int len2 = strlen(num2);
    int maxLen = len1 > len2 ? len1 : len2;

    // 分配足够大的内存空间
    char* result = (char*)malloc(sizeof(char) * (maxLen + 2)); 
    
    /*不能maxLen + 1，因为本身两个数相加就会出现位数较多的一方就可能出现位数 + 1的情况，
    但是因为是字符串数组，结尾必定是以‘/0’进行结尾的，要给‘/0’留下空间，不然进行打印时
    就会出现程序一直运行，直到程序崩溃的情况*/
    
    
    int carry = 0;//这个变量是用来表示进位的情况，例如9 + 8 = 17，那么这里的carry就等于 1

    // 逐位相加
    for (int i = 0; i < maxLen; i++) 
    {
        /*下面这两步是为了保证（i + 1） <= len1或len2，位数少的一方会通过这两步在前面自动补0*/
        int digit1 = i < len1 ? num1[i] - '0' : 0;
        int digit2 = i < len2 ? num2[i] - '0' : 0;
        
        int sum = digit1 + digit2 + carry;//对应位相加再加上来自上一位相加的进位
        result[i] = (sum % 10) + '0';//因为sum%10得到的是整型，加上‘0’使其变成字符型
        carry = sum / 10;
    }

    // 如果最后有进位，添加到结果中
    if (carry) 
    {
        result[maxLen] = carry + '0';
        result[maxLen + 1] = '\0';
    }
    else 
    {
        result[maxLen] = '\0';
    }

    // 反转结果字符串
    reverseString(result);

    return result;
}
